// 优惠券相应方法整合
import { noUserReason, checkReason } from '@constants/coupons';
import logger from '@common/logger';
/**
 * 获取可用的优惠券信息
 * @param {Array} coupons 用户优惠券列表
 * @param {Object} discountInfo 优惠信息
 */
export const getCanUseRedpacket = (coupons, discountInfo) => {
    const { available=[], using=[] } = discountInfo.data.coupons.whole || {};
    const arr = [...available, ...using];
    return coupons.filter(item => arr.indexOf(item.serialNumber) > -1);
};

/**
 * 判断当前优惠券是否可选，是否存在互斥问题
 * @param {Object} item 优惠券信息
 * @param {Array} coupons 可用的所有优惠券
 * @param {Array} selectVal 已经选中的优惠券 sn 数组
 */
export const checkIsDisabled = (item, coupons, selectVal=[]) => {
    // 没有选择全部可选
    if (selectVal.length === 0) {
        return false;
    }
    logger.info('当前红包数据：', item);
    logger.warn('当前选中的结果：', selectVal);
    // 判断当前是否已经选中
    const len = selectVal.filter(i => i === item.serialNumber).length;
    logger.warn('当前元素是否在选中的结果中：', len);
    if (len > 0) {
        // 当前已经选中
        return false;
    } else {
        // 当前没有选中
        // 判断是否选中的存在不可叠加的劵
        let haveOneCantOver = false;
        for (let i = 0; i < selectVal.length; i++) {
            const temp = selectVal[i];
            const flag = coupons.filter(info => temp === info.serialNumber)[0].canOver;
            if (!flag) {
                haveOneCantOver = true;
                break;
            }
        }
        logger.warn('选中的是否存不可叠加的元素', haveOneCantOver);
        if (haveOneCantOver) {
            // 存在不可叠加的劵
            return true;
        } else {
            logger.warn('当前元素是否可叠加', item.canOver);
            // 不存在不可叠加的劵
            // 判断是否当前为不可叠加的劵
            return item.canOver ? false : true;
        }
    }
};

/**
 * 处理为自用的红包数据，便于选择的操作
 * @param {Array} coupons 用户优惠券信息
 * @param {Array} discountList 优惠信息的红包list
 */
export const dealRedPacketData = (coupons=[], discountList=[]) => {
    const enableArr = [];
    const disableArr = [];
    const seltctVal = [];
    for (let i = 0; i < coupons.length; i++) {
        const item = coupons[i];
        for (let j = 0; j < discountList.length; j++) {
            const temp = discountList[j];
            if (item.serialNumber === temp.sn) {
                // 在营销返回的结果中
                // status // 0-未选中 1-选中 2-不可选
                // reason // 不能用的原因
                // type // 1-不可叠加券 2-可叠加券
                const { status, reason, type } = temp.show;
                if (checkReason.indexOf(reason) > -1 || type === 2 || status !== 2) {
                    if (status === 1) {
                        seltctVal.push(temp.sn);
                    }
                    enableArr.push({
                        ...item,
                        isSelect: status === 1, // 是否选中
                        canOver: type === 2, // 能否覆盖
                        canUse: status === 2, // 能否可用
                    });
                } else {
                    disableArr.push({
                        ...item,
                        isSelect: false, // 是否选中
                        canOver: type === 2, // 能否覆盖
                        canUse: false, // 能否可用
                        noUseReason: noUserReason[reason], // 不能使用原因
                    });
                }
            }
        }
        if ((enableArr.length + disableArr.length) === discountList.length) {
            // 拿到所有的返回数据，直接跳出
            break;
        }
    }
    return {
        enable: enableArr,
        disable: disableArr,
        selected: seltctVal,
    };
};

/**
 * 处理生成，可用商品劵和不可用商品劵
 * @param {Array} coupons 优惠券信息
 * @param {Object} discountInfo 优惠信息
 */
export const dealCouponsData = (coupons=[], discountInfo={}) => {
    const { using=[], available=[], unavailable=[] } = discountInfo;
    const canUse = [...using, ...available];
    let enableCoupons = [];
    let disableCoupons = [];
    for (let i = 0; i < coupons.length; i++) {
        const item = coupons[i];
        if (canUse.indexOf(item.serialNumber) > -1) {
            enableCoupons.push(item);
        }
        if (unavailable.indexOf(item.serialNumber) > -1) {
            disableCoupons.push(item);
        }
    }
    return {
        enableCoupons,
        disableCoupons,
    };
};
